package org.spring.context;

import javax.security.auth.login.Configuration;

/**
 * 接口，由在处理@{@link Configuration}类时注册其他bean定义的类型实现。
 * 当需要或需要在bean定义级别(与{@code @Bean}方法实例级别相对)进行操作时，这很有用。
 *
 * <p>与{@code @configuration}和{@link ImportSelector}一起，这种类型的类可以提供给@{@link Import}注释(也可以从{@code ImportSelector}返回)。
 *
 * <p>一个{@link ImportBeanDefinitionRegistrar}可以实现以下任何一个{@link org.springframework.bean.factory.Aware}接口，
 * 它们各自的方法将在{@link #registerBeanDefinitions}之前被调用:
 * <ul>
 * <li>{@link org.springframework.context.EnvironmentAware EnvironmentAware}</li>
 * <li>{@link org.springframework.beans.factory.BeanFactoryAware BeanFactoryAware}
 * <li>{@link org.springframework.beans.factory.BeanClassLoaderAware BeanClassLoaderAware}
 * <li>{@link org.springframework.context.ResourceLoaderAware ResourceLoaderAware}
 * </ul>
 *
 * <p>或者，类可以提供一个构造函数，其中包含一个或多个受支持的形参类型:
 * <ul>
 * <li>{@link org.springframework.core.env.Environment Environment}</li>
 * <li>{@link org.springframework.beans.factory.BeanFactory BeanFactory}</li>
 * <li>{@link ClassLoader ClassLoader}</li>
 * <li>{@link org.springframework.core.io.ResourceLoader ResourceLoader}</li>
 * </ul>
 *
 * <p>See implementations and associated unit tests for usage examples.
 *
 * @author Chris Beams
 * @author Juergen Hoeller
 * @see Import
 * @see ImportSelector
 * @see Configuration
 * @since 3.1
 */
public interface ImportBeanDefinitionRegistrar {

    /**
     * 根据导入类{@code @Configuration}的给定注释元数据，必要时注册bean定义。
     * <p>
     * 注意，由于与{@code @Configuration}类处理相关的生命周期约束，{@link BeanDefinitionRegistryPostProcessor}类型可能在这里注册<em>而不是<em>。
     * <p>默认实现委托
     * {@link #registerBeanDefinitions(AnnotationMetadata, BeanDefinitionRegistry)}.
     *
     * @param importingClassMetadata  导入类的注释元数据
     * @param registry                当前bean定义注册表
     * @param importBeanNameGenerator 默认情况下，导入bean的bean名称生成器策略:{@link ConfigurationClassPostProcessor#IMPORT_BEAN_NAME_GENERATOR}，
     *                                如果设置了{@link ConfigurationClassPostProcessor#setBeanNameGenerator}，则使用用户提供的策略。
     *                                在后一种情况下，传入的策略将用于包含应用程序上下文中的组件扫描(否则，
     *                                默认的组件扫描命名策略是{@link AnnotationBeanNameGenerator#INSTANCE})。
     *
     * @see ConfigurationClassPostProcessor#IMPORT_BEAN_NAME_GENERATOR
     * @see ConfigurationClassPostProcessor#setBeanNameGenerator
     * @since 5.2
     */
//    default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
//                                         BeanNameGenerator importBeanNameGenerator) {
//        registerBeanDefinitions(importingClassMetadata, registry);
//    }

    /**
     * 根据导入类{@code @Configuration}的给定注释元数据，必要时注册bean定义。
     * <p>
     * 注意，由于与{@code @Configuration}类处理相关的生命周期约束，{@link BeanDefinitionRegistryPostProcessor}类型可能在这里注册<em>而不是<em>。
     * <p>
     * 默认实现为空。
     *
     * @param importingClassMetadata 导入类的注释元数据
     * @param registry               当前bean定义注册表
     */
//    default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//    }

}
